#include<iostream>
template<typename T, typename ...Ts>
auto concat(T t, Ts... ts){
    if constexpr (sizeof...(ts)>0) {
        return [=](auto ... params){
                 return (concat(ts...)(t(params...)));
               };
    } else {
        return t;
    }
}

int main(){
    auto f1([](auto x) { return x*5; });
    auto f2([](auto x) { return x+2; });
    auto print([](int x) { std::cout<<x<<std::endl; return x; });
    auto func = concat(f1, f2, print);
    func(20);
    return 0;
}
